/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.model.service;

import com.model.domain.enaho.registro.Capitulo600Resumen;
import com.model.domain.persona.Hogar;
import com.model.domain.persona.HogarXmlTransferido;
import com.model.domain.proceso.envio.carga.ControlEnvioHogar;
import com.model.domain.proceso.envio.carga.LogXmlCargado;
import com.model.domain.proceso.envio.carga.ProcesoCarga;
import com.model.domain.proceso.envio.carga.EstadoCarga;
import com.model.domain.proceso.envio.carga.TipoCarga;
import com.model.domain.proceso.envio.subida.LogXmlTransferido;
import com.model.domain.ubicacion.ViviendaXmlTransferido;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import util.file.Archivo;
import util.www.sql.WhereSqlDinamicoCond;

/**
 * @author Rdelacruz
 */
public class HogarXmlTransferidoService 
extends AbstractService
{   

    /**
     * Se necesita un objeto controlHogar con id_envio y cod_hogar 
     * @param con
     * @param controlHogar
     * @throws SQLException 
     */
    public void updateUltimaCarga(Connection con, ControlEnvioHogar controlHogar) throws SQLException {                
        Statement st = null;
        try {
            st = con.createStatement();          
            LogXmlCargado logxmlcargado = controlHogar.getLogXmlCargado();
            Integer id_carga = logxmlcargado.getId();            
            Integer id_envio = logxmlcargado.getLogXmlTransferido().getId();            
            String cod_hogar = controlHogar.getReglaEnvioHogar().getHogarXml().getCodigoHogar();
            if(id_envio==null || cod_hogar==null) {
                throw new SQLException("identificador nulo en sentencia UPDATE");
            }
            
            //int res = controlHogar.getResultado().getId();
            //String tipo = logxmlcargado.getProcesoCarga().getTipo().getCodigo();
            String sql = "UPDATE Envios_hogarxmltransferidos SET"
                    //+ " resultadoUltimaCarga="+res+",tipoUltimaCarga='"+tipo+"'"+                    
                    + " id_carga_ultima="+id_carga+                    
                    " WHERE id_envio="+id_envio+" and hogar="+cod_hogar;
            st.executeUpdate(sql);
        }        
        finally {
            if(st!=null) st.close();
        }
    }
            
    public void save(Connection con, HogarXmlTransferido ht) throws Exception {
        PreparedStatement ps_hogar = null;//cada hogar de un Archivo XML
        try { 
            String sql_hogar = "insert into Envios_hogarxmltransferidos"
                    + "(id_envio, hogar, resFin, nroMiembros"
                    + ",cap601_si, cap601_no"
                    + ",cap602_si, cap602_no"
                    + ",cap602A_si, cap602A_no"
                    + ",cap603_si, cap603_no"
                    + ",cap604_si, cap604_no"
                    + ",cap605_si, cap605_no"
                    + ",cap606_si, cap606_no"
                    + ",cap606D_si, cap606D_no"
                    + ",cap607_si, cap607_no"
                    + ",cap609_si, cap609_no"
                    + ",cap610_si, cap610_no"
                    + ",cap611_si, cap611_no"
                    + ",cap612_si, cap612_no"
                    + ") values (?,?,?,?"
                    + ",?,?"
                    + ",?,?"
                    + ",?,?"
                    + ",?,?"
                    + ",?,?"
                    + ",?,?"
                    + ",?,?"
                    + ",?,?"
                    + ",?,?"
                    + ",?,?"
                    + ",?,?"
                    + ",?,?"
                    + ",?,?"
                    + ")";
            ps_hogar = con.prepareStatement(sql_hogar);
            
            Integer id_envio = ht.getViviendaXmlTransferido().getLogXmlTransferido().getId();
            
            Hogar h = ht.getHogar();
            ps_hogar.setInt(1, id_envio);
            ps_hogar.setString(2, h.getCodigoString());
            ps_hogar.setString(3, h.getResultadoFinalString());
            ps_hogar.setInt(4, ht.getHogar().getNroMiembros());
            
            ps_hogar.setInt(5, ht.getCap601().getNroFilasSi());
            ps_hogar.setInt(6, ht.getCap601().getNroFilasNo());
            
            ps_hogar.setInt(7, ht.getCap602().getNroFilasSi());
            ps_hogar.setInt(8, ht.getCap602().getNroFilasNo());
            
            ps_hogar.setInt(9, ht.getCap602A().getNroFilasSi());
            ps_hogar.setInt(10, ht.getCap602A().getNroFilasNo());
            
            ps_hogar.setInt(11, ht.getCap603().getNroFilasSi());
            ps_hogar.setInt(12, ht.getCap603().getNroFilasNo());
            
            ps_hogar.setInt(13, ht.getCap604().getNroFilasSi());
            ps_hogar.setInt(14, ht.getCap604().getNroFilasNo());
            
            ps_hogar.setInt(15, ht.getCap605().getNroFilasSi());
            ps_hogar.setInt(16, ht.getCap605().getNroFilasNo());
            
            ps_hogar.setInt(17, ht.getCap606().getNroFilasSi());
            ps_hogar.setInt(18, ht.getCap606().getNroFilasNo());
            
            ps_hogar.setInt(19, ht.getCap606D().getNroFilasSi());
            ps_hogar.setInt(20, ht.getCap606D().getNroFilasNo());
            
            ps_hogar.setInt(21, ht.getCap607().getNroFilasSi());
            ps_hogar.setInt(22, ht.getCap607().getNroFilasNo());
            
            ps_hogar.setInt(23, ht.getCap609().getNroFilasSi());
            ps_hogar.setInt(24, ht.getCap609().getNroFilasNo());
            
            ps_hogar.setInt(25, ht.getCap610().getNroFilasSi());
            ps_hogar.setInt(26, ht.getCap610().getNroFilasNo());
            
            ps_hogar.setInt(27, ht.getCap611().getNroFilasSi());
            ps_hogar.setInt(28, ht.getCap611().getNroFilasNo());
            
            ps_hogar.setInt(29, ht.getCap612().getNroFilasSi());
            ps_hogar.setInt(30, ht.getCap612().getNroFilasNo());
                        
            ps_hogar.executeUpdate();
        }
        catch(Exception ex) {
            Archivo a = ht.getViviendaXmlTransferido().getLogXmlTransferido().getOperacionSubida().getArchivo();
            throw new Exception("No se pudo registrar el Hogar XML numero '"+ht.getHogar().getCodigoString()+"' del archivo "+a.getNombre(),ex);
        }
        finally {
            if(ps_hogar!=null) ps_hogar.close();
        }
        
        
        
    }
    
    public List<HogarXmlTransferido> findByIdEnvio(Connection con, int idEnvio) throws SQLException {
        return findByIdEnvio_PorLoMenosTengaEstadoCarga(con,idEnvio,null);
    }
    
    public List<HogarXmlTransferido> findByIdEnvio_PorLoMenosTengaEstadoCarga(Connection con, int idEnvio, EstadoCarga estadoCarga) throws SQLException {
        List<HogarXmlTransferido> lista = new ArrayList<HogarXmlTransferido>();
        List<HogarXmlTransferido> listaTemp = new ArrayList<HogarXmlTransferido>();
        Statement st = null;//cada hogar de un Archivo XML
        try {      
            st = con.createStatement();
            
            //WhereSql whereSql = new WhereSql();
            //whereSql.agregarInt("HT.id_envio",idEnvio);            
            //if(estadoCarga!=null)
                //whereSql.agregarInt("CH.resultado", estadoCarga.getId());                         
            
            String sql = "select HT.*, \n" +
"CH.resultado as resultadoUltimaCarga, \n" +
"LC.tipocarga as tipoUltimaCarga\n" +
"from Envios_hogarxmltransferidos HT\n" +
"left join Envios_control_hogar CH\n" +
"	on HT.id_carga_ultima = CH.id_carga and HT.hogar = CH.hogarxml\n" +
"left join Envios_logxmlcargados LC\n" +
"	on HT.id_carga_ultima = LC.id	\n" +
"where HT.id_envio="+idEnvio+
";";
            
            boolean agregarHogares = false;            
            if(estadoCarga==null)
                agregarHogares = true;//siempre agregara
            
            ResultSet rs = st.executeQuery(sql);
            while(rs.next()) {                
                HogarXmlTransferido ht = new HogarXmlTransferido();
                
                LogXmlTransferido logxml = new LogXmlTransferido();
                logxml.setId(idEnvio);
                
                ViviendaXmlTransferido vxml = new ViviendaXmlTransferido();
                vxml.setLogXmlTransferido(logxml);
                
                ht.setViviendaXmlTransferido(vxml);
                
                Hogar h = new Hogar();
                h.setCodigo(rs.getString("hogar"));
                h.setResultadoFinal(rs.getString("resFin"));
                h.setNroMiembros(rs.getInt("nroMiembros"));
                ht.setHogar(h);
                
                
                ProcesoCarga proc = new ProcesoCarga();
                LogXmlCargado logxmlc = new LogXmlCargado();        
                logxmlc.setProcesoCarga(proc);
                ControlEnvioHogar control = new ControlEnvioHogar();
                control.setLogXmlCargado(logxmlc);
                
                proc.setTipo(TipoCarga.get(rs.getString("tipoUltimaCarga")));                
                control.setEstado(EstadoCarga.get(rs.getInt("resultadoUltimaCarga")));
                ht.setUltimaCarga(control);
                
                Capitulo600Resumen cap;
                cap = new Capitulo600Resumen();
                cap.setNroFilasNo(rs.getInt("cap601_no"));
                cap.setNroFilasSi(rs.getInt("cap601_si"));                
                ht.setCap601(cap);
                
                cap = new Capitulo600Resumen();
                cap.setNroFilasNo(rs.getInt("cap602_no"));
                cap.setNroFilasSi(rs.getInt("cap602_si"));                
                ht.setCap602(cap);
                
                cap = new Capitulo600Resumen();
                cap.setNroFilasNo(rs.getInt("cap602A_no"));
                cap.setNroFilasSi(rs.getInt("cap602A_si"));                
                ht.setCap602A(cap);
                
                cap = new Capitulo600Resumen();
                cap.setNroFilasNo(rs.getInt("cap603_no"));
                cap.setNroFilasSi(rs.getInt("cap603_si"));                
                ht.setCap603(cap);
                
                cap = new Capitulo600Resumen();
                cap.setNroFilasNo(rs.getInt("cap604_no"));
                cap.setNroFilasSi(rs.getInt("cap604_si"));                
                ht.setCap604(cap);
                
                cap = new Capitulo600Resumen();
                cap.setNroFilasNo(rs.getInt("cap605_no"));
                cap.setNroFilasSi(rs.getInt("cap605_si"));                
                ht.setCap605(cap);
                
                cap = new Capitulo600Resumen();
                cap.setNroFilasNo(rs.getInt("cap606_no"));
                cap.setNroFilasSi(rs.getInt("cap606_si"));
                ht.setCap606(cap);
                
                cap = new Capitulo600Resumen();
                cap.setNroFilasNo(rs.getInt("cap606D_no"));
                cap.setNroFilasSi(rs.getInt("cap606D_si"));                
                ht.setCap606D(cap);
                
                cap = new Capitulo600Resumen();
                cap.setNroFilasNo(rs.getInt("cap607_no"));
                cap.setNroFilasSi(rs.getInt("cap607_si"));                
                ht.setCap607(cap);
                
                cap = new Capitulo600Resumen();
                cap.setNroFilasNo(rs.getInt("cap609_no"));
                cap.setNroFilasSi(rs.getInt("cap609_si"));
                ht.setCap609(cap);
                
                cap = new Capitulo600Resumen();
                cap.setNroFilasNo(rs.getInt("cap610_no"));
                cap.setNroFilasSi(rs.getInt("cap610_si"));                
                ht.setCap610(cap);
                
                cap = new Capitulo600Resumen();
                cap.setNroFilasNo(rs.getInt("cap611_no"));
                cap.setNroFilasSi(rs.getInt("cap611_si"));                
                ht.setCap611(cap);
                
                cap = new Capitulo600Resumen();
                cap.setNroFilasNo(rs.getInt("cap612_no"));
                cap.setNroFilasSi(rs.getInt("cap612_si"));
                ht.setCap612(cap);
                
                /*
                cap = new Capitulo600Resumen();
                cap.setNroFilasNo(rs.getInt("cap612A_no"));
                cap.setNroFilasSi(rs.getInt("cap612A_si"));                
                ht.setCap612A(cap);
                */
                
                listaTemp.add(ht);
                
                //Si hay por lo menos una coincidencia, entonces se agregaran todos los hogares
                if(estadoCarga!=null && estadoCarga==control.getEstado()) {
                    agregarHogares = true;
                }
                
            }      
            
            if(agregarHogares) {
                for(HogarXmlTransferido temp: listaTemp) {
                    lista.add(temp);
                }
            }
            
        }
        finally {
            if(st!=null) st.close();
        }        
        
        return lista;
    }
    
    

 
}
